/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polylifegame.model;

/**
 *
 * @author epulapp
 */
public class SimulateurManager extends Thread{
    
    //<editor-fold defaultstate="collapsed" desc="Variables de classe">
   
    // Nombre de thread
    private int nbThread;
    // Environnement courant
    private Environnement environnement;
    // Tableau des simulateurs(Thread)
    private Simulateur[] simulateurs;
    //</editor-fold>  
    
    //<editor-fold defaultstate="collapsed" desc="Constructeurs">
    /**
     * Constructeur par défaut
     */
    public SimulateurManager(){
       
    }   

    /**
     * Constructeur personnalisé
     * @param nbThread : Nombre de thread
     * @param environnement : Environnement courant
     */
    public SimulateurManager(int nbThread, Environnement environnement){
        this.nbThread = nbThread;
        this.simulateurs = new Simulateur[nbThread];
        this.environnement = environnement;
        
        // Initialisation de tous les thread + démarrage
        for (int a = 0; a < nbThread; a++) {
           this.simulateurs[a] = new Simulateur(environnement, a, this.nbThread);
           this.simulateurs[a].start();
        }
    }
    
    //</editor-fold>
  
    //<editor-fold defaultstate="collapsed" desc="Méthodes de classe">
    /**
     * Demarer tout les thread
     */
    public synchronized void play(){
        for(Simulateur unSimulateur: this.simulateurs)  {
            unSimulateur.play();
        }  
    }
    
    /**
     *  Mise en pause de tout les thread
     */
    public void pause() {
        for(Simulateur unSimulateur: this.simulateurs)  {
               unSimulateur.pause();
        }
            
    }
    
    /*
     * Boucle du thread
     */
    @Override
    public void run() {
        while (true) {
            Boolean ok = true;
            for(Simulateur unSimulateur: this.simulateurs)  {
               if(!unSimulateur.getTour()) ok = false;
            }
            
            // Lorsque tout les thread on fini un tour -> Mise a jour de l'état N 
            
            if(ok) {
                environnement.miseAJourEtatN();
                play();
            }
        }
    }
    
    //</editor-fold>  

}